<?php
namespace Zxf5115\Laravel\Local\Upload\Utils;

use Illuminate\Support\Str;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;

/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * 资源上传工具类
 */
class FileUtil
{
  /**
   * 获取资源响应数据
   *
   * @param UploadedFile $file 上传文件对象
   * @param string $url 文件路径
   * @param bool $is_filename 是否返回文件名
   * @return array|string
   */
  public static function getResourceData(UploadedFile $file, string $url, bool $is_filename = false) : array|string
  {
    return $is_filename
           ? ['filename' => $file->getClientOriginalName(), 'url' => self::getCompleteUrl($url)]
           : self::getCompleteUrl($url);
  }


  /**
   * 组装完整URL
   *
   * @param string $url 相对路径
   * @return string
   */
  public static function getCompleteUrl(string $url) : string
  {
    return url('storage/' . ltrim($url, '/'));
  }


  /**
   * 生成安全的文件名
   *
   * @param UploadedFile $file 上传文件对象
   * @return string
   */
  public static function getFileName(UploadedFile $file): string
  {
    $extension = strtolower($file->getClientOriginalExtension());

    // 文件名
    $hash = self::getFileHash($file->getRealPath());

    // 组装新的文件名
    return $hash . '.' . $extension;
  }


  /**
   * 计算文件哈希值
   *
   * @param string $path 文件绝对路径
   * @return string
   */
  public static function getFileHash(string $path): string
  {
    // 文件哈希
    return File::hash($path);
  }


  /**
   * 设置文件存储目录
   *
   * @param string $path 基础路径
   * @return string
   */
  public static function setFileDir(string $path): string
  {
    // 严格过滤特殊字符，防止目录遍历攻击
    $path = preg_replace('/[^\w\-\/]/', '', $path);
    $path = trim($path, '/');
    $dateDir = date('Y-m-d');

    // 组合路径并确保目录存在
    $fullPath = $path . '/' . $dateDir;

    // 如果目录不存在，创建目录
    Storage::disk('public')->makeDirectory($fullPath, 0755, true);

    return $fullPath;
  }
}
